﻿Imports PTIC_Util
Imports PTIC_Util.GestionCalculs


Namespace Comptes

    ''' <summary>
    ''' Représente le compte technique Non-Vie
    ''' </summary>
    ''' <remarks></remarks>
    Public Class CompteTechniqueNonVie_V2
        Inherits CalculCompose

        Private _hasPMrente As Boolean
        Private _hasPMpprc As Boolean
        Private _parametresEntree As Parametres

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <param name="hasPMrente"></param>
        ''' <param name="hasPPRC"></param>
        ''' <remarks></remarks>
        Public Sub New(ByVal hasPMrente As Boolean, ByVal hasPPRC As Boolean)
            MyBase.New()
            _resultats = New ResultatsCRTNonVie
            _hasPMrente = hasPMrente
            _hasPMpprc = hasPPRC
        End Sub

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Friend Property hasPMrente() As Boolean
            Get
                Return _hasPMrente
            End Get
            Set(ByVal value As Boolean)
                _hasPMrente = value
            End Set
        End Property
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Friend Property hasPPRC() As Boolean
            Get
                Return _hasPMpprc
            End Get
            Set(ByVal value As Boolean)
                _hasPMpprc = value
            End Set
        End Property

        ''' <summary>
        ''' Données initiales utilisées pour faire les calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property ParametresEntree() As Parametres
            Get
                Return _parametresEntree
            End Get
            Friend Set(ByVal value As Parametres)
                _parametresEntree = value
            End Set
        End Property

        ''' <summary>
        ''' Résultats des calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads ReadOnly Property Resultats() As ResultatsCRTNonVie
            Get
                Return _resultats
            End Get
        End Property

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub procedureCalcul()

            Dim resultatCalcul As New ResultatsCRTNonVie

            With _parametresEntree

                'Création des tableaux attendus en sortie du compte
                ReDim resultatCalcul.PrimesIT(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.SinReglesIT(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.PmRenteouv(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.PmPPRCouv(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.produitPlacementsAlloues(.nbAnneesProjetees - 1)

                ReDim resultatCalcul.TaxeAssu(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.PmRenteClot(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.PmPPRCClot(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.FG(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.ComApporteur(.nbAnneesProjetees - 1)
                ReDim resultatCalcul.ResultatsNonVie(.nbAnneesProjetees - 1)

                For i = 1 To .nbAnneesProjetees

                    If i <= .pmITclotTheo.Count Then

                        resultatCalcul.PrimesIT(i - 1) = .primesIT(i - 1)
                        resultatCalcul.SinReglesIT(i - 1) = .sinReglesIT(i - 1)

                        'PM Rente Clôture
                        resultatCalcul.PmRenteClot(i - 1) = IIf(_hasPMrente, Math.Max(0, .pmRenteItTheo(i - 1)), 0)
                        'PM PPRC clôture
                        resultatCalcul.PmPPRCClot(i - 1) = IIf(_hasPMpprc, Math.Max(0, .pmPPRCItTheo(i - 1)), 0)

                        'PM rente et PPRC ouverture
                        If i = 1 Then
                            resultatCalcul.PmRenteouv(i - 1) = 0
                            resultatCalcul.PmPPRCouv(i - 1) = 0
                        Else
                            resultatCalcul.PmPPRCouv(i - 1) = resultatCalcul.PmPPRCClot(i - 2)
                            resultatCalcul.PmRenteouv(i - 1) = resultatCalcul.PmRenteClot(i - 2)
                        End If
                        'Produit des placements alloués
                        resultatCalcul.produitPlacementsAlloues(i - 1) = ((resultatCalcul.PmRenteClot(i - 1) _
                                                                       + resultatCalcul.PmRenteouv(i - 1) _
                                                                       + resultatCalcul.PmPPRCClot(i - 1) _
                                                                       + resultatCalcul.PmPPRCouv(i - 1)) / 2) * _parametresEntree.tx_TechA
                        'Frais de gestion
                        resultatCalcul.FG(i - 1) = .primesIT(i - 1) * (1 - .taxe_Assu) * .fg
                        'Taxe d'assurance
                        resultatCalcul.TaxeAssu(i - 1) = .taxe_Assu * .primesIT(i - 1)
                        'Commission apporteur
                        resultatCalcul.ComApporteur(i - 1) = ParametresEntree.comApporteur * ParametresEntree.primesIT(i - 1) * (1 - .taxe_Assu)
                        'Résultat non vie
                        resultatCalcul.ResultatsNonVie(i - 1) = ParametresEntree.primesIT(i - 1) _
                                                 + resultatCalcul.PmRenteouv(i - 1) _
                                                 + resultatCalcul.PmPPRCouv(i - 1) _
                                                 + resultatCalcul.produitPlacementsAlloues(i - 1) _
                                                 - resultatCalcul.TaxeAssu(i - 1) _
                                                 - .sinReglesIT(i - 1) _
                                                 - resultatCalcul.PmRenteClot(i - 1) _
                                                 - resultatCalcul.PmPPRCClot(i - 1) _
                                                 - resultatCalcul.FG(i - 1) _
                                                 - resultatCalcul.ComApporteur(i - 1)
                    Else
                        resultatCalcul.PrimesIT(i - 1) = 0
                        resultatCalcul.SinReglesIT(i - 1) = 0
                        'PM Rente Clôture
                        resultatCalcul.PmRenteClot(i - 1) = 0
                        'PM PPRC clôture
                        resultatCalcul.PmPPRCClot(i - 1) = 0
                        'PM rente et PPRC ouverture
                        resultatCalcul.PmRenteouv(i - 1) = 0
                        resultatCalcul.PmPPRCouv(i - 1) = 0
                        'Produit des placements alloués
                        resultatCalcul.produitPlacementsAlloues(i - 1) = 0
                        'Frais de gestion
                        resultatCalcul.FG(i - 1) = 0
                        'Taxe d'assurance
                        resultatCalcul.TaxeAssu(i - 1) = 0
                        'Commission apporteur
                        resultatCalcul.ComApporteur(i - 1) = 0
                        'Résultat non vie
                        resultatCalcul.ResultatsNonVie(i - 1) = 0
                    End If
                Next

            End With
            _resultats = resultatCalcul
        End Sub


        ''' <summary>
        ''' Parametre utilisé pour évaluer les comptes techniques non vie
        ''' </summary>
        ''' <remarks></remarks>
        Public Class Parametres

            ''' <summary>
            ''' Représente le nombre d'années de projection
            ''' </summary>
            ''' <remarks></remarks>
            Public Property NbAnneesProjetees As Integer

            ''' <summary>
            ''' Frais de gestion annuels
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Fg As Double

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Taxe_Assu As Double

            ''' <summary>
            ''' Représente la commission versée à l'apporteur d'affaires
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ComApporteur As Double

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Tx_TechA As Double

            ''' <summary>
            ''' Représente les primes pour le risque Incapacité au travail
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PrimesIT As Double()

            ''' <summary>
            ''' Représente le montant des sinistres régles pour le risque Incapacité au travail
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SinReglesIT As Double()

            ''' <summary>
            ''' Représente les primes théoriques pour les sinsitres IT clos
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmITclotTheo As Double()

            ''' <summary>
            ''' Représente les rentes théoriques pour les sinsitres IT clos
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmRenteItTheo As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmPPRCItTheo As Double()
        End Class

        ''' <summary>
        ''' Résultat de l'évaluation des comptes techniques Non-Vie
        ''' </summary>
        ''' <remarks></remarks>
        Public Class ResultatsCRTNonVie
            'Création des tableaux attendus en sortie du compte

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PrimesIT As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property SinReglesIT As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmRenteouv As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmPPRCouv As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ProduitPlacementsAlloues As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property TaxeAssu As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmRenteClot As Double()

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <remarks></remarks>
            Public Property PmPPRCClot As Double()

            ''' <summary>
            ''' Frais de gestion annuels
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Fg As Double()

            ''' <summary>
            ''' Représente la commission versée à l'apporteur d'affaires
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ComApporteur As Double()

            ''' <summary>
            ''' Résultats NON-VIE
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ResultatsNonVie As Double()

            ''' <summary>
            ''' Fait une copie des données
            ''' </summary>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function Copy() As ResultatsCRTNonVie
                Dim result As New ResultatsCRTNonVie
                Dim primesIT_copy(PrimesIT.Count - 1) As Double
                Dim sinReglesIT_copy(SinReglesIT.Count - 1) As Double
                Dim pmRenteouv_copy(PmRenteouv.Count - 1) As Double
                Dim pmPPRCouv_copy(PmPPRCouv.Count - 1) As Double
                Dim produitPlacementsAlloues_copy(ProduitPlacementsAlloues.Count - 1) As Double
                Dim taxeAssu_copy(TaxeAssu.Count - 1) As Double
                Dim pmRenteClot_copy(PmRenteClot.Count - 1) As Double
                Dim pmPPRCClot_copy(PmPPRCClot.Count - 1) As Double
                Dim FG_copy(FG.Count - 1) As Double
                Dim comApporteur_copy(ComApporteur.Count - 1) As Double
                Dim resultatsNonVie_copy(ResultatsNonVie.Count - 1) As Double
                For i = 0 To PrimesIT.Count - 1
                    primesIT_copy(i) = PrimesIT(i)
                    sinReglesIT_copy(i) = SinReglesIT(i)
                    pmRenteouv_copy(i) = PmRenteouv(i)
                    pmPPRCouv_copy(i) = PmPPRCouv(i)
                    produitPlacementsAlloues_copy(i) = ProduitPlacementsAlloues(i)
                    taxeAssu_copy(i) = TaxeAssu(i)
                    pmRenteClot_copy(i) = PmRenteClot(i)
                    pmPPRCClot_copy(i) = PmPPRCClot(i)
                    FG_copy(i) = FG(i)
                    comApporteur_copy(i) = ComApporteur(i)
                    resultatsNonVie_copy(i) = ResultatsNonVie(i)
                Next
                result.PrimesIT = primesIT_copy
                result.SinReglesIT = sinReglesIT_copy
                result.PmRenteouv = pmRenteouv_copy
                result.PmPPRCouv = pmPPRCouv_copy
                result.ProduitPlacementsAlloues = produitPlacementsAlloues_copy
                result.TaxeAssu = taxeAssu_copy
                result.PmRenteClot = pmRenteClot_copy
                result.PmPPRCClot = pmPPRCClot_copy
                result.FG = FG_copy
                result.ComApporteur = comApporteur_copy
                result.ResultatsNonVie = resultatsNonVie_copy
                Return result
            End Function
        End Class

    End Class

End Namespace